//C++标准IO流
//C++标准库提供了4个全局流对象cin、cout、cerr、clog
//使用cout进行标准输出，即数据从内存流向控制台(显示器)
//使用cin进行标准输入即数据通过键盘输入到程序中
//同时C++标准库还提供了cerr用来进行标准错误的输出
//以及clog进行日志的输出
//cout、cerr、clog是ostream类的三个不同的对象
//因此这三个对象基本没有区别，只是应用场景不同。
//在使用时候必须要包含文件并引入std标准命名空间。
//
//注意：
//1.cin为缓冲流。键盘输入的数据保存在缓冲区中
//当要提取时，是从缓冲区中拿。如果一次输入过多，会留在那儿慢慢用
//如果输入错了，必须在回车之前修改，如果回车键按下就无法挽回了。
//只有把输入缓冲区中的数据取完后，才要求输入新的数据。
//
//2. 输入的数据类型必须与要提取的数据类型一致，否则出错。
//出错只是在流的状态字state中对应位置位（置1），程序继续。
//
//3. 空格和回车都可以作为数据之间的分格符
//所以多个数据可以在一行输入也可以分行输入
//但如果是字符型和字符串，则空格（ASCII码为32）无法用cin输入
//字符串中也不能有空格。回车符也无法读入。
//
//4. cin和cout可以直接输入和输出内置类型数据
//原因：标准库已经将所有内置类型的输入和输出全部重载了
//
//5. 对于自定义类型，如果要支持cin和cout的标准输入输出需要对<<和>>进行重载。
//
//6. 在线OJ中的输入和输出：
//对于IO类型的算法，一般都需要循环输入
//c语言

#include <iostream>
#include <stdio.h>

using namespace std;

class A
{
public:
        operator bool()
        {
            return _a != -1;
        }

        int _a;
};

class date 
{
    friend ostream& operator<<(ostream& _cout, const date& d);
public:
    date(int year = 2022, int month = 10, int day = 6)
        :_year(year)
         ,_month(month)
         ,_day(day)
    {}

private:
    int _year;
    int _month;
    int _day;
};

ostream& operator<<(ostream& _cout, const date& d)
{
    std::cout << "year = " << d._year                                                                                                                   
        << ",month = "<< d._month
        << ",day = " << d._day; 
    return _cout;
}


int main()
{
    ////c语言接收字符串的时候
    //char a[128];
    //while(scanf("%s", a) != EOF)
    //{
    //    cout << a << endl;
    //}

    ////c++接收字符串的时候
    //string str;
    //while(cin >> str)
    //{
    //    cout << str << endl;
    //}

    //第一个循环可以理解,scanf如果的返回为EOF,那么就结束循环
    //第二个循环,cin返回的是自己的对象,那么为什么对象可以作为判断循环结束的条件呢?
    //std:ios:operator bool 有bool的函数重载,但是bool不是一个操作符
    //这个是特殊的,记住就行了
    //operator bool提供一个本类型到bool的饮食转换,不允许使用参数
    //那么当文件没有读取到尾部的时候,标志位为好的,那么就返回真
    //如果结束了,那么标志位设置为坏,那么就返回假
    
    A a_;

    while(a_)
    {
        cin >> a_._a; 
    }

    return 0;
}
